// Локальные
#include "linal/gauss.h"

namespace linal
{
	//============================================================================================================================
	//============================================================================================================================
	void Gauss::solveLowSLAE(const CSRMatrix &matrix, Vector &f)
	{
		Q_ASSERT_X(matrix.dimension() == f.dimension(), "Gauss::solveLowSLAE", "matrix and vector have different dimensions");
		for(int i = 0; i < matrix.dimension(); i++)
		{
			for(int j = matrix.ig()[i]; j < matrix.ig()[i + 1]; j++)
				f[i] -= matrix.ggl()[j]*f[matrix.jg()[j]];
			f[i] /= matrix.di()[i];
		}
	}

	//============================================================================================================================
	//============================================================================================================================
	void Gauss::solveUpSLAE(const CSRMatrix &matrix, Vector &f)
	{
		Q_ASSERT_X(matrix.dimension() == f.dimension(), "Gauss::solveUpSLAE", "matrix and vector have different dimensions");
		for(int i = matrix.dimension() - 1; i > 0; i--)
			for(int j = matrix.ig()[i + 1] - 1; j >= matrix.ig()[i]; j--)
				f[matrix.jg()[j]] -= matrix.ggu()[j]*f[i];
	}
}